/*
go 1.20 支持老系统win7

go version
go env
go env -w  GO111MODULE="on"
set GOPATH="C:\myservice"

go mod init myservice

go mod tidy
go get golang.org/x/sys/windows/svc
go get github.com/shirou/gopsutil

go build .
go build -ldflags "-s -w" -o myservice.exe myservice.go

go run myservice.go

signtool sign /a /t http://timestamp.digicert.com /v hello.exe
*/
package main

import (
	"fmt"
	"io"
	"log"
	hi "myservice/get_hard_info"
	"os"
	"path/filepath"
	"time"
) // 项目名字/文件夹名 (自动识别包名)

//"strconv"

const devPath_ = "C:\\myservice\\"

func main() {
	/*
	 本身 注册成服务，
	 通过定时执行线程 上报资产信息。
	*/
	log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
	hi.Igetset = Igetset() //配置变量函数
	hi.Igetset("cfgFile", "cfg.json")
	hi.Igetset("logFile", "myheadinfo.log")
	// dir, err := os.Executable()
	// if err != nil {
	// 	log.Fatal(err)
	// }
	// 获取当前程序执行路径
	if len(os.Args) > 1 && os.Args[1] == "test" {
		hi.Igetset("testMod", 1)
		hi.Igetset("binDir", devPath_)
		// testMod = 1
		// binPath = devPath_
	} else {
		hi.Igetset("testMod", 0)
		hi.Igetset("binDir", filepath.Dir(os.Args[0]))
		// testMod = 0
		// binPath = filepath.Dir(os.Args[0])
	}

	binDir := hi.Igetset("binDir", nil).(string)
	cfgFile := hi.Igetset("cfgFile", nil).(string)
	cfgPath := filepath.Join(binDir, cfgFile)
	hi.Igetset("cfgPath", cfgPath)
	logFile := hi.Igetset("logFile", nil).(string)
	logPath := filepath.Join(binDir, logFile)
	hi.Igetset("logPath", logPath)

	testMod := hi.Igetset("testMod", nil).(int)

	cfg := hi.I读取json配置文件(cfgPath) //jo对象
	hi.Igetset("cfg", cfg)
	//选择性执行
	log.Printf("启动运行 模式：%v ", testMod)
	log.Printf("binDir 路径 :%s\n", binDir)
	if testMod == 1 {
		//双写日志
		log.Println("自定义日志输出路径 :", logPath)
		// 打开日志文件
		//file, err := os.OpenFile(logPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
		file, err := os.Create(logPath)
		if err != nil {
			log.Fatal(err) //退出

		}
		defer file.Close()
		mw := io.MultiWriter(os.Stdout, file)
		log.SetOutput(mw)
		//----------

		//hi.I定期执行()
		//hi.Posthttp()

		main2()
		// 硬件信息dc := hi.I硬件信息()
		// macAddr := 硬件信息dc["网卡地址"].(string)
		// //并行1个通道
		// done := make(chan bool, 1)
		// go func() {
		// 	hi.Posthttp(硬件信息dc, "http://oq-upinfo.17121.top:2029/upinfo/"+uname+","+macAddr)
		// 	done <- true
		// }()
		// <-done //等待返回
		//hi.Gip()
		log.Println("完成离开 testMode :", testMod)
	} else {

		// 打开日志文件  以服务运行没有  os.Stdout 可被打开
		//file, err := os.OpenFile(logPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
		file, err := os.Create(logPath)
		if err != nil {
			log.Fatal(err)
		}
		defer file.Close()

		// 设置日志输出到文件
		log.SetOutput(file)

		// 写入日志
		log.Printf("以服务的方式运行：%v ", testMod)
		go hi.I定期执行() //首次就执行一次
		hi.S系统服务程序()  //堵塞
		log.Printf(" 离开服务 进入select {}   ")
		select {} //堵塞 二次堵塞锁住
	}

	// Code to run the service interactively for testing purposes.
	log.Printf("结束退出. Press Ctrl+C to stop.")

}

// 创建一个累加器函数
func Igetset() func(name string, value interface{}) interface{} {
	// 定义变量
	gvalue := make(map[string]interface{})

	// 返回一个变量
	return func(name string, value interface{}) interface{} {
		if value == nil {
			return gvalue[name]
		} else {
			gvalue[name] = value
			return nil
		}
	}

}

func main2() {
	// Add 时间相加
	// 获取开始时间

	// 模拟一些工作

	mx, _ := time.ParseDuration("-1m")
	ntime := time.Now().Add(2 * mx) //时间差
	log.Println(ntime, "分钟时间")

	// 获取结束时间
	duration := time.Now().Sub(ntime)

	if int(duration.Minutes()) > 1 { //60>1
		fmt.Printf(" 时间差.分钟 > 1 for %v   %v \n", int(duration.Minutes()), duration.Minutes())
	} else {
		fmt.Printf("时间差.< 1 for %v   %v \n", int(duration.Minutes()), duration.Minutes())
	}
	//fmt.Printf("时间差.< 1 for %v   %v \n",   duration.Minutes())

}

// func 解析json字符串(jsonBuf string) map[string]interface{} {
// 	if jsonBuf == "" {
// 		jsonBuf = `
//     {
//     "company": "itcast",
// 	"z中文k": {"a":"b","c":"d"},
//     "subjects": [
//         "Go",
//         "C++",
//         "Python",
//         "Test"
//     ],
//     "isok": true,
//     "price": 666.666
// }`
// 	}
// 	//创建一个map
// 	m := make(map[string]interface{}, 4)

// 	err := json.Unmarshal([]byte(jsonBuf), &m) //Unmarshal 编码成map对象
// 	if err != nil {
// 		log.Printf(" json解析错误 =:   %v\n %s \n", err, rundebug.Stack())
// 		return m
// 	}
// 	fmt.Printf("m = %+v\n", m)

// 	var str string

// 	//类型断言, 值，它是value类型
// 	fmt.Printf("值类型为 %T, value = %v\n", m, m)
// 	for key, value := range m {
// 		//fmt.Printf("%v ============> %v\n", key, value)
// 		switch data := value.(type) {
// 		case string:
// 			str = data
// 			log.Printf("map[%s]的值类型为 %T, value = %s\n", key, str, data)
// 		case bool:
// 			log.Printf("map[%s]的值类型为 %T, value = %v\n", key, data, data)
// 		case float64:
// 			log.Printf("map[%s]的值类型为 %T, value = %f\n", key, data, data)
// 		case []string:
// 			log.Printf("string map[%s]的值类型为 %T, value = %v\n", key, data, data)
// 		case []interface{}:
// 			log.Printf("map[%s]的值类型为 %T, value = %v\n", key, data, data)
// 			log.Printf("map[%s]的值类型为 %T, value = %v\n", key, data, data[0])
// 		default:
// 			log.Printf("map[%s]的值类型为 %T, value = %T\n", key, data, data)
// 		}

// 	}
// 	log.Printf("json obj 值类型为 %T, value = %v\n", m, m)
// 	//写json文件(m,"回写配置.json")
// 	return m

// }

/*
----上报json结构
{
	"名称"："姓+名",
	"网卡地址":"ab:cd:ef:ee"
	"网卡名称":"ab:cd:ef:ee"
	"处理器":"xxxuit"
	"处理器核数": 8
	"处理器频率": 8
	"内存大小": 10
	"内存空闲": 3
	"内存使用": 3
}

----配置文件json结构
{
	"名称":"姓+名"
	"上报http地址":"http://oq-upinfo.1717.top/upinfo/姓+名"
	"上报间隔":60   #单位分钟
	"下任务地址":"http://oq-upinfo.1717.top/getrun/姓+名.json"


}
---- 自动下载执行
{
	"执行内容":"xxxxxxxx"
	"下载到":"./bin"

}
*/

// func 读取json配置文件() *jsonvalue.V {
// 	var obj *jsonvalue.V //数据类型
// 	cfgFile := filepath.Join(binPath, cfgFile_)
// 	//打开文件
// 	file, err := os.Open(cfgFile)
// 	if err != nil {
// 		log.Errorf("读取cfg.json 配置文件错误: %v\n %s\n", err, rundebug.Stack())
// 		return obj
// 	}
// 	defer file.Close()

// 	// 读取内容
// 	data, err := ioutil.ReadAll(file)
// 	if err != nil {
// 		fmt.Printf("Error reading file: %v\n", err)
// 		return obj
// 	}
// 	// 解析 JSON 数据
// 	obj, err = jsonvalue.Unmarshal(data)
// 	if err != nil {
// 		fmt.Printf("解析 JSON内容出错 ： %v\n %s\n", err, rundebug.Stack())
// 		return obj
// 	}

// 	return obj
// }

// func 读取json配置文件2() {
// 	var obj *jsonvalue.V //数据类型
// 	cfgFile := filepath.Join(binPath, cfgFile_)
// 	file, err := os.Open(cfgFile)
// 	if err != nil {
// 		log.Errorf("读取cfg.json 配置文件错误: %v\n %s\n", err, rundebug.Stack())
// 		return
// 	}
// 	defer file.Close()

// 	// 读取文件内容
// 	data, err := ioutil.ReadAll(file)
// 	if err != nil {
// 		fmt.Printf("Error reading file: %v\n", err)
// 		return
// 	}

// 	// 解析 JSON 数据
// 	obj, err = jsonvalue.Unmarshal(data)
// 	if err != nil {
// 		fmt.Printf("Error unmarshalling JSON: %v\n", err)
// 		return
// 	}

// 	//var err error
// 	// 获取 一个值
// 	// jsKey := "名称"
// 	// name, err := v.GetString(jsKey)
// 	// if err != nil {
// 	// 	fmt.Printf("Error getting 'name' value: %v\n", err)
// 	// 	return
// 	// }
// 	str, err1 := obj.GetString("person", "name", "fullName")
// 	if err1 != nil {
// 		return
// 	}
// 	fmt.Printf("person.name.fullName = %s\n", str)

// 	// v := jsonvalue.NewObject()
// 	// v.MustSet("Hello, JSON!").At("greeting")
// 	// 打开文件

// 	// jsonStr, err := obj.MarshalString()
// 	// if err != nil {
// 	// 	fmt.Printf("Error marshalling JSON: %v\n", err)
// 	// 	return
// 	// }
// 	//jsonObj := 解析json字符串(jsonStr)
// 	//写json文件(jsonObj, "回写配置.json")
// }
